package com.zjny.util;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.Collections;
import java.util.List;
import java.util.Objects;

/**
 * <p>
 * MybatisPlus工具类
 * </p>
 *
 * @author cui haida
 * 2024/05/10/11:10
 */
public class MybatisUtils {

    private static final int DEFAULT_PAGE_SIZE = 10;
    private static final int DEFAULT_PAGE_INDEX = 1;

    /**
     * 根据给定的列表、页码和页面大小，获取分页对象。
     *
     * @param list 要进行分页的列表，不可为null。
     * @param pageNo 请求的页码，如果为null，则默认为1。
     * @param pageSize 请求的每页大小，如果为null，则默认为10。
     * @return 返回一个Page对象，包含当前页的记录、当前页码、每页大小、总记录数等信息。
     */
    public static <T> Page<T> getPage(List<T> list, Integer pageNo, Integer pageSize) {
        // 初始化Page对象，如果pageNo和pageSize为null，则使用默认值
        Page<T> page = new Page<>(null != pageNo ? pageNo : DEFAULT_PAGE_INDEX, null != pageSize ? pageSize : DEFAULT_PAGE_SIZE);
        // 设置当前页的记录列表，如果列表为空，则返回空列表；否则，根据页码和页面大小进行分页
        page.setRecords(list.isEmpty() ? Collections.emptyList() : startPage(list, null != pageNo ? pageNo : DEFAULT_PAGE_INDEX, null != pageSize ? pageSize : DEFAULT_PAGE_SIZE));
        // 设置当前页码，如果pageNo为null，则默认为1
        page.setCurrent(null != pageNo ? pageNo : DEFAULT_PAGE_INDEX);
        // 设置每页大小，如果pageSize为null，则默认为10
        page.setSize(null != pageSize ? pageSize : DEFAULT_PAGE_SIZE);
        // 设置总记录数
        page.setTotal(list.size());
        return page;
    }

    /**
     * 截取
     *
     * @param list     待处理数据集
     * @param pageNum  页码
     * @param pageSize 条数
     * @return 截取结果
     */
    private static <T> List<T> startPage(List<T> list, Integer pageNum, Integer pageSize) {
        if (list == null) {
            return Collections.emptyList();
        }
        if (list.isEmpty()) {
            return Collections.emptyList();
        }
        //记录总数 开始索引 结束索引
        int count = list.size();
        int fromIndex = (pageNum - 1) * pageSize;
        int toIndex = pageNum * pageSize;
        if (fromIndex + 1 > count) {
            return Collections.emptyList();
        }
        if (pageNum * pageSize > count) {
            toIndex = count;
        }
        return list.subList(fromIndex, toIndex);
    }

    /**
     * 获取分页信息。
     *
     * @param pageIndex 请求的页码，如果为null，则默认为0。
     * @param pageSize 每页的大小，如果为null，则默认为10。
     * @return 返回一个包含页码和每页大小的Page对象。
     */
    public static <T> Page<T> getPageInfo(Integer pageIndex, Integer pageSize) {
        // 校验并设置pageIndex的默认值
        if (Objects.isNull(pageIndex)) {
            pageIndex = 0;
        }
        // 校验并设置pageSize的默认值
        if (Objects.isNull(pageSize)) {
            pageSize = 10;
        }
        // 创建并返回Page对象
        return new Page<>(pageIndex, pageSize);
    }
}
